import { HttpAdapterHost, NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
import { AllExceptionsFilter } from './exceptions/all-exceptions.filter';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // 开启跨域
  app.enableCors();
  // 开启自动验证
  app.useGlobalPipes(new ValidationPipe());
  // 全局异常错误统一处理
  const { httpAdapter } = app.get(HttpAdapterHost);
  app.useGlobalFilters(new AllExceptionsFilter(httpAdapter));

  // Swagger API文档
  const config = new DocumentBuilder()
    .setTitle('权限系统接口管理')
    .setDescription(
      `<p>点击查看 <a href="/api-doc-json" target="_blank">Swagger JSON</a></p>
      <h4>测试环境</h4>
      <p>http://openapi-test.nestjs.com</p>
      <h4>线上环境</h4>
      <p>http://openapi.nestjs.com</p>
      <p>https://openapi.nestjs.com</p>
      <h4>成功返回</h4>
      <p>code 等于 0 就属于成功返回</p>
      <p><pre>
      {
        "code": 0,
        "data": "业务相关的数据",
        "message": "success"
      }
      </pre></p>
      <h4>错误描述</h4>
      <p>code 不等于 0 就属于错误，小于 0 是全局错误（登录失效、无权限等），大于 0 是业务错误（每个接口可能错误码一致，但是业务错误不一致）</p>
      <p><pre>
      {
        "code": -1,
        "message": "登录失效，请重新登录"
      }
      </pre><pre>
      {
        "code": 1,
        "message": "查询商品数据失败"
      }
      </pre></p>`,
    )
    .setVersion('1.0')
    // .addTag('cats')
    .addBearerAuth()
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('api-doc', app, document, {
    swaggerOptions: {
      docExpansion: 'none', // 折叠所有的属性
    },
  });

  await app.listen(3000);
}
bootstrap();
